<?php
/**
 * MyApp 封装了应用程序的基本启动流程和初始化操作，并为应用程序提供一些公共服务。
 *
 * 主要完成下列任务：
 * - 初始化运行环境
 * - 提供应用程序入口
 * - 为应用程序提供公共服务
 * - 处理访问控制和用户信息在 session 中的存储
 */
class MyApp {
	//应用程序的基本设置
	protected $_app_config;

    /**
     * 构造函数: 构造应用程序对象
     *
     * @param array $app_config
     */
     function __construct(array $app_config) {
        // #IFDEF DEBUG
        global $g_boot_time;
        //Log::log('--- STARTUP TIME --- ' . $g_boot_time, Log::DEBUG);
        // #ENDIF

        // 初始化应用程序设置
        $this->_app_config = $app_config;
        $this->_initConfig();

        // 设置默认的时区
        date_default_timezone_set('Asia/Shanghai');

        // 导入类搜索路径
        ML::import($app_config['APP_DIR']);
        ML::import($app_config['APP_DIR'] . '/m');
        //ML::import($app_config['MODULE_DIR']);

        // 注册应用程序对象
        //ML::register($this, 'app');
    }

    /**
     * 初始化应用程序设置
     */
    protected function _initConfig() {
        #IFDEF DEBUG
        //Log::log(__METHOD__, Log::DEBUG);
        #ENDIF

        ///*
        // 载入配置文件
        if ($this->_app_config['CONFIG_CACHED']) {

            // 构造缓存服务对象
            $backend = $this->_app_config['CONFIG_CACHE_BACKEND'];
            $settings = isset($this->_app_config['CONFIG_CACHE_SETTINGS'][$backend]) ? $this->_app_config['CONFIG_CACHE_SETTINGS'][$backend] : null;
            $cache = new $backend($settings);

            // 载入缓存内容
            $cache_id = $this->_app_config['APPID'] . '_app_config';
            $config = $cache->get($cache_id);
            if (!empty($config)) {
                ML::replaceIni($config);
                return;
            }
        }
        //*/

        // 没有使用缓存，或缓存数据失效
        $config = self::loadConfigFiles($this->_app_config);
        ///*
        if ($this->_app_config['CONFIG_CACHED']) {
            $cache->set($cache_id, $config);
        }
        //*/

        ML::replaceIni($config);
    }

    /**
     * 载入配置文件内容
     *
     * @param array $app_config
     * @return array
     */
    static function loadConfigFiles(array $app_config)
    {
        $ext = !empty($app_config['CONFIG_FILE_EXTNAME'])
               ? $app_config['CONFIG_FILE_EXTNAME']
               : 'php';
        $cfg = $app_config['CONFIG_DIR'];

        //配置文件名
        $files = array
        (
            "{$cfg}/db.{$ext}"  => 'db_dsn_pool', //数据库
            "{$cfg}/app.{$ext}" => 'appini', //当前应用
        );

        $replace = array();
        foreach ($app_config as $key => $value) {
            if (!is_array($value)) $replace["{$key}"] = $value;
        }

        $config = require(ML_PATH . '/conf/conf.php'); //框架默认配置文件
        $config = array_merge($config, $replace);

        foreach ($files as $filename => $scope) {
            if (!file_exists($filename)) continue;
            //$contents = Helper_YAML::load($filename, $replace);
            $contents = require($filename);
            //$contents = array_merge($arr_file, $replace);
            if ($scope == 'global') {
                $config = array_merge($config, $contents);
            } else {
                if (!isset($config[$scope])) {
                    $config[$scope] = array();
                }
                $config[$scope] = array_merge($config[$scope], $contents);
            }
        }

        return $config;
    }




    /**
     * 析构函数
     */
    function __destruct()
    {
        // #IFDEF DBEUG
        global $g_boot_time;
        $shutdown_time = microtime(true);
        $length = $shutdown_time - $g_boot_time;
        //Log::log("--- SHUTDOWN TIME --- {$shutdown_time} ({$length})sec", Log::DEBUG);
        // #ENDIF
    }
}
?>